/**
 * MP3模块完整控制扩展库
 * 硬件连接：MP3 TX → Micro:bit P0；MP3 RX → Micro:bit P1
 */
namespace mp3Control {
    // 初始化串口通信（固定波特率9600）
    serial.redirect(
        SerialPin.P1,    // Micro:bit的TX引脚（发送数据到MP3的RX）
        SerialPin.P0,    // Micro:bit的RX引脚（接收MP3的TX数据）
        BaudRate.BaudRate9600
    )

    // 基础控制命令定义
    const CMD_PLAY = hex`7e 02 01 ef`             // 播放
    const CMD_PAUSE = hex`7e 02 02 ef`            // 暂停
    const CMD_NEXT = hex`7e 02 03 ef`             // 下一曲
    const CMD_PREV = hex`7e 02 04 ef`             // 上一曲
    const CMD_VOL_UP = hex`7e 02 05 ef`           // 音量加
    const CMD_VOL_DOWN = hex`7e 02 06 ef`         // 音量减
    const CMD_CYCLE_START = hex`7e 03 07 01 ef`   // 全部循环播放（开始）
    const CMD_CYCLE_STOP = hex`7e 03 07 00 ef`    // 全部循环播放（停止）
    const CMD_RANDOM_START = hex`7e 03 08 01 ef`  // 随机播放（开始）
    const CMD_RANDOM_STOP = hex`7e 03 08 00 ef`   // 随机播放（停止）
    const CMD_SHUTDOWN = hex`7e 02 0a ef`         // 关机
    const CMD_RESET = hex`7e 02 0b ef`            // 复位重启

    /**
     * 发送字节命令到MP3模块
     */
    function sendCommand(cmd: Buffer) {
        serial.writeBuffer(cmd)
    }

    /**
     * 基础操作类型（下拉菜单选项）
     */
    export enum Mp3BasicAction {
        //% block="播放"
        Play,
        //% block="暂停"
        Pause,
        //% block="下一曲"
        Next,
        //% block="上一曲"
        Prev,
        //% block="音量加"
        VolUp,
        //% block="音量减"
        VolDown,
        //% block="全部循环播放（开始）"
        CycleStart,
        //% block="全部循环播放（停止）"
        CycleStop,
        //% block="随机播放（开始）"
        RandomStart,
        //% block="随机播放（停止）"
        RandomStop,
        //% block="关机"
        Shutdown,
        //% block="复位重启"
        Reset
    }

    /**
     * 执行基础操作（通过下拉菜单选择）
     * @param action 要执行的操作
     */
    //% block="MP3 执行基础操作 %action"
    //% blockId=mp3_basic_action
    //% weight=100
    export function executeBasicAction(action: Mp3BasicAction) {
        switch (action) {
            case Mp3BasicAction.Play:
                sendCommand(CMD_PLAY)
                break
            case Mp3BasicAction.Pause:
                sendCommand(CMD_PAUSE)
                break
            case Mp3BasicAction.Next:
                sendCommand(CMD_NEXT)
                break
            case Mp3BasicAction.Prev:
                sendCommand(CMD_PREV)
                break
            case Mp3BasicAction.VolUp:
                sendCommand(CMD_VOL_UP)
                break
            case Mp3BasicAction.VolDown:
                sendCommand(CMD_VOL_DOWN)
                break
            case Mp3BasicAction.CycleStart:
                sendCommand(CMD_CYCLE_START)
                break
            case Mp3BasicAction.CycleStop:
                sendCommand(CMD_CYCLE_STOP)
                break
            case Mp3BasicAction.RandomStart:
                sendCommand(CMD_RANDOM_START)
                break
            case Mp3BasicAction.RandomStop:
                sendCommand(CMD_RANDOM_STOP)
                break
            case Mp3BasicAction.Shutdown:
                sendCommand(CMD_SHUTDOWN)
                break
            case Mp3BasicAction.Reset:
                sendCommand(CMD_RESET)
                break
        }
    }

    /**
     * 播放指定编号的MP3文件（如001.MP3对应编号1）
     * @param fileNumber 文件编号（1-255）
     */
    //% block="MP3 播放编号为 %fileNumber 的文件"
    //% blockId=mp3_play_specific_file
    //% fileNumber.min=1 fileNumber.max=255  // 限制文件编号范围
    //% weight=90  // 优先级低于基础操作
    export function playSpecificFile(fileNumber: number) {
        // 构建播放指定文件的命令：7e 04 0f 00 [fileNumber] ef
        const cmd = pins.createBuffer(6)
        cmd[0] = 0x7e    // 帧头
        cmd[1] = 0x04    // 长度
        cmd[2] = 0x0f    // 播放指定文件指令码
        cmd[3] = 0x00    // 高位地址（固定）
        cmd[4] = fileNumber & 0xff  // 低位地址（文件编号）
        cmd[5] = 0xef    // 帧尾
        sendCommand(cmd)
    }
}
